home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / system-config-printer / troubleshoot / ChooseNetworkPrinter.py < prev    next >
Encoding:
Python Source  |  2009-05-05  |  6.0 KB  |  166 lines

  1. #!/usr/bin/env python
  2.  
  3. ## Printing troubleshooter
  4.  
  5. ## Copyright (C) 2008 Red Hat, Inc.
  6. ## Copyright (C) 2008 Tim Waugh <twaugh@redhat.com>
  7.  
  8. ## This program is free software; you can redistribute it and/or modify
  9. ## it under the terms of the GNU General Public License as published by
  10. ## the Free Software Foundation; either version 2 of the License, or
  11. ## (at your option) any later version.
  12.  
  13. ## This program is distributed in the hope that it will be useful,
  14. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ## GNU General Public License for more details.
  17.  
  18. ## You should have received a copy of the GNU General Public License
  19. ## along with this program; if not, write to the Free Software
  20. ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. import cups
  23. import gobject
  24. from timedops import TimedOperation
  25. from base import *
  26. class ChooseNetworkPrinter(Question):
  27.     def __init__ (self, troubleshooter):
  28.         Question.__init__ (self, troubleshooter, "Choose network printer")
  29.         page1 = self.initial_vbox (_("Choose Network Printer"),
  30.                                    _("Please select the network printer you "
  31.                                      "are trying to use from the list below. "
  32.                                      "If it does not appear in the list, "
  33.                                      "select 'Not listed'."))
  34.         tv = gtk.TreeView ()
  35.         name = gtk.TreeViewColumn (_("Name"),
  36.                                    gtk.CellRendererText (), text=0)
  37.         location = gtk.TreeViewColumn (_("Location"),
  38.                                        gtk.CellRendererText (), text=1)
  39.         info = gtk.TreeViewColumn (_("Information"),
  40.                                    gtk.CellRendererText (), text=2)
  41.         name.set_property ("resizable", True)
  42.         location.set_property ("resizable", True)
  43.         info.set_property ("resizable", True)
  44.         tv.append_column (name)
  45.         tv.append_column (location)
  46.         tv.append_column (info)
  47.         tv.set_rules_hint (True)
  48.         sw = gtk.ScrolledWindow ()
  49.         sw.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  50.         sw.set_shadow_type (gtk.SHADOW_IN)
  51.         sw.add (tv)
  52.         page1.pack_start (sw, True, True, 0)
  53.         self.treeview = tv
  54.         troubleshooter.new_page (page1, self)
  55.  
  56.     def display (self):
  57.         answers = self.troubleshooter.answers
  58.         if answers['cups_queue_listed']:
  59.             return False
  60.  
  61.         if not answers.get ('remote_server_cups', False):
  62.             return False
  63.  
  64.         server = answers['remote_server_name']
  65.         if not server:
  66.             server = answers['remote_server_ip_address']
  67.  
  68.         model = gtk.ListStore (gobject.TYPE_STRING,
  69.                                gobject.TYPE_STRING,
  70.                                gobject.TYPE_STRING,
  71.                                gobject.TYPE_PYOBJECT)
  72.         self.model = model
  73.         self.treeview.set_model (model)
  74.         iter = model.append (None)
  75.         model.set (iter, 0, _("Not listed"), 1, '', 2, '', 3, None)
  76.  
  77.         parent = self.troubleshooter.get_window ()
  78.  
  79.         try:
  80.             cups.setServer (server)
  81.             self.op = TimedOperation (cups.Connection, parent=parent)
  82.             c = self.op.run ()
  83.             self.op = TimedOperation (c.getDests, parent=parent)
  84.             dests = self.op.run ()
  85.             printers = None
  86.             dests_list = []
  87.             for (name, instance), dest in dests.iteritems ():
  88.                 if name == None:
  89.                     continue
  90.  
  91.                 if instance != None:
  92.                     queue = "%s/%s" % (name, instance)
  93.                 else:
  94.                     queue = name
  95.  
  96.                 if printers == None:
  97.                     self.op = TimedOperation (c.getPrinters)
  98.                     printers = self.op.run ()
  99.  
  100.                 if not printers.has_key (name):
  101.                     info = _("Unknown")
  102.                     location = _("Unknown")
  103.                 else:
  104.                     printer = printers[name]
  105.                     info = printer.get('printer-info', _("Unknown"))
  106.                     location = printer.get('printer-location', _("Unknown"))
  107.  
  108.                 dests_list.append ((queue, location, info, dest))
  109.  
  110.             dests_list.sort (lambda x, y: cmp (x[0], y[0]))
  111.             for queue, location, info, dest in dests_list:
  112.                 iter = model.append (None)
  113.                 model.set (iter, 0, queue, 1, location, 2, info, 3, dest)
  114.  
  115.         except cups.HTTPError:
  116.             pass
  117.         except cups.IPPError:
  118.             pass
  119.         except RuntimeError:
  120.             pass
  121.  
  122.         return True
  123.  
  124.     def connect_signals (self, handler):
  125.         self.signal_id = self.treeview.connect ("cursor-changed", handler)
  126.  
  127.     def disconnect_signals (self):
  128.         self.treeview.disconnect (self.signal_id)
  129.  
  130.     def can_click_forward (self):
  131.         model, iter = self.treeview.get_selection ().get_selected ()
  132.         if iter == None:
  133.             return False
  134.         return True
  135.  
  136.     def collect_answer (self):
  137.         if not self.troubleshooter.answers.get ('remote_server_cups', False):
  138.             return {}
  139.  
  140.         model, iter = self.treeview.get_selection ().get_selected ()
  141.         if not model:
  142.             return {}
  143.  
  144.         dest = model.get_value (iter, 3)
  145.         if dest == None:
  146.             class enum_dests:
  147.                 def __init__ (self, model):
  148.                     self.dests = []
  149.                     model.foreach (self.each, None)
  150.  
  151.                 def each (self, model, path, iter, user_data):
  152.                     dest = model.get_value (iter, 3)
  153.                     if dest:
  154.                         self.dests.append ((dest.name, dest.instance))
  155.  
  156.             return { 'remote_cups_queue_listed': False,
  157.                      'remote_cups_dests_available': enum_dests (model).dests }
  158.         else:
  159.             return { 'remote_cups_queue_listed': True,
  160.                      'remote_cups_dest': dest,
  161.                      'remote_cups_queue': dest.name,
  162.                      'remote_cups_instance': dest.instance }
  163.  
  164.     def cancel_operation (self):
  165.         self.op.cancel ()
  166.